There are a wide variety of software systems that process a stream of network data. Some examples of software systems of this type include: optimizing a video data stream for a particular end device such as a smartphone that cannot display a 1080p video stream, inserting advertising into a HTTP flow between a device and a server, compressing data, optimizing HTML, etc. In all of these examples, if the application processing the stream fails, it is a reasonable thing to do to just bypass the application, passing the network flow on either without the “value” that the application adds or to have that value added by another application or system element.
In hierarchical container-based software systems, if an application fails, then two actions are typically taken. First, the data being supplied to the application is stopped or re-directed. Second, the application is recovered (e.g. restarted), if possible. There is a well known pattern for managing recovery in hierarchical software systems. The recovery (restart) should to be managed through the hierarchical container relationship. That is to say that the application server should attempt to restart the application. If the application server is unable to restart the application, then a reasonable recovery action would be to restart the application server. If that fails, the next container in the hierarchy should restart. And so the pattern of escalation of the failure escalates through the hierarchy.